package com.dhcc.DRGsHosp.infra.util.sax;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.dhcc.DRGsHosp.infra.util.MonitorResultUtil;

public class Myhandler extends DefaultHandler {
    //存储正在解析的元素的数据
    private List<Map<String,String>> map=null;
    //存储所有解析的元素的数据
    private List<List<Map<String,String>>> list=null;
    //正在解析的元素的名字
    String currentTag=null;
    //正在解析的元素的元素值
    StringBuilder currentValue=new StringBuilder();
    //开始解析的元素
    String nodeName=null;
    //zhan
    private Stack<Map<String, String>> s = new Stack<>();

    public Myhandler(String nodeName) {
        this.nodeName=nodeName;
    }
    
    public List<List<Map<String,String>>> getList() {
        return list;
    }

    //开始解析文档，即开始解析XML根元素时调用该方法
    @Override
    public void startDocument() throws SAXException {
        //初始化Map
        list=new LinkedList<>();
    }
    
    //开始解析每个元素时都会调用该方法
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        //判断正在解析的元素是不是开始解析的元素
        if(qName.equals(nodeName)){
            map = new LinkedList();
        }
        String tagsAttrs = "";
        //判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中，如:<person id="00001"></person>
        if(attributes!=null&&map!=null){
            for(int i=0;i<attributes.getLength();i++){
            	if(!MonitorResultUtil.isChinese(attributes.getValue(i)) && MonitorResultUtil.hasLength(attributes.getValue(i))){
            		tagsAttrs += "["+attributes.getQName(i)+"|"+attributes.getValue(i)+"]";
            	}
            }
        }
        currentTag=qName;  //正在解析的元素
        Map<String, String> sMap = new HashMap<>();
        currentValue.setLength(0);//初始化缓存的串
        sMap.put("tags", qName);
        sMap.put("tagsAttrs", tagsAttrs);
        s.push(sMap);
    }
    
    //解析到每个元素的内容时会调用此方法
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if(currentTag!=null&&map!=null){
            currentValue.append(ch,start,length);
        }
    }
    
    private String getStackString(Stack<Map<String, String>> s){
		String str = "";
		if(s == null) return str;
		for (Map<String, String> x : s) {
			str += x.get("tags")+x.get("tagsAttrs");
			str += "_";
		}
		if(str.length()>1){
			str = str.substring(0, str.length()-1);
		}
		return str;
    }
    
    //每个元素结束的时候都会调用该方法
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    	if(currentTag!=null&&map!=null){
    		//获取节点内容
        	String currentValueStr = currentValue.toString();
        	//如果内容不为空和空格，也不是换行符则将该元素名和值和存入map中
            if(currentValueStr!=null&&!"".equals(currentValueStr.trim())&&!"\n".equals(currentValueStr.trim())){
            	String key = getStackString(s);
            	Map<String, String> m = new HashMap<>();
                m.put("tags", key);
                m.put("tagValue", currentValueStr);
                m.put("tagName", currentTag);
                map.add(m);
            }
            //当前的元素已解析过，将其置空用于下一个元素的解析
            currentTag=null;
    	}
    	
        //判断是否为一个节点结束的元素标签
        if(qName.equals(nodeName)){
            list.add(map);
            map=null;
        }
        Map<String, String> tags = s.pop();
        if(!qName.equals(tags.get("tags"))){
        	s.push(tags);
        }
    }
    
    //结束解析文档，即解析根元素结束标签时调用该方法
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
}